package algo3.grupo3.modelo;

import algo3.grupo3.modelo.Bomba;

public class Enemigo extends ObjetoAnimado implements DependienteDelTiempo {
	private Casilla posicion;
	private double delayMovimiento = DELAY_MOVIMIENTO, cronometroMovimiento = 0.0, delayAtaque = DELAY_ATAQUE
	, cronometroAtaque = 0.0;
	private EstrategiaMovimiento estrategiaMovimientoActual;
	private EstrategiaMovimiento[] estrategiaMovimientosPosibles;
	private int indiceEstrategiaMovimientoPosibleActual = 0;
 	private Bomba bombaDelEnemigo;
	
	public static final double DELAY_MOVIMIENTO = 2000;//medido en milisegundos, antes 1000
	public static final int DURABILIDAD_MAXIMA_ENEMIGO = 20;
	public static final int DURABILIDAD_CECILIO = 5;
	public static final int DURABILIDAD_LOPEZ_REGGAE = 10;
	public static final int DURABILIDAD_LOPEZ_REGGAE_ALADO = DURABILIDAD_CECILIO;
	public static final int PODER_ENEMIGO = 1;
	public static final double DELAY_ATAQUE = 6000;//antes 3000 antes 4000 antes 5000
	
	public static final int CECILIO = 0,LOPEZ_REGGAE = 1,LOPEZ_REGGAE_ALADO = 2;
	private int tipoEnemigo = CECILIO;
	
	public static final int MOVIMIENTO_ARRIBA=0 ,MOVIMIENTO_IZQUIERDA=1, MOVIMIENTO_ABAJO=2, MOVIMIENTO_DERECHA=3;
	
	public Enemigo(int durabilidad){
		if(durabilidad > DURABILIDAD_MAXIMA_ENEMIGO){
			this.durabilidad = DURABILIDAD_MAXIMA_ENEMIGO;
			return;
		}
		this.durabilidad= durabilidad;
		this.cargarEstrategiaMovimientosPosiblesDefault();
		this.cambiarEstrategiaMovimiento(estrategiaMovimientosPosibles[0]);
		this.bombaDelEnemigo = new Bomba();
		this.bombaDelEnemigo.convertirABombaEnemigo();
	}//fin de constructor
	
	public Enemigo(){
		this.cargarEstrategiaMovimientosPosiblesDefault();
		this.cambiarEstrategiaMovimiento(estrategiaMovimientosPosibles[0]);
		this.durabilidad = DURABILIDAD_CECILIO;
		this.bombaDelEnemigo = new Bomba();
		this.bombaDelEnemigo.convertirABombaEnemigo();
	}//fin de constructor
	
	
	public Enemigo(Casilla posicion){
		this.posicion = posicion;
		this.posicion.ocupar(this);
		this.cargarEstrategiaMovimientosPosiblesDefault();
		this.cambiarEstrategiaMovimiento(estrategiaMovimientosPosibles[0]);
		this.durabilidad = DURABILIDAD_CECILIO;
		this.bombaDelEnemigo = new Bomba();
		this.bombaDelEnemigo.convertirABombaEnemigo();
	}//fin de constructor
	
	public void convertirACecilio(){
		
		cargarEstrategiaMovimientosPosiblesDefault();
		this.durabilidad = DURABILIDAD_CECILIO;
		this.tipoEnemigo= CECILIO;
		
	}//fin de convertirACecilio
	
	public void convertirALopezReggae(){
		
		cargarEstrategiaMovimientosPosiblesDefault();
		this.durabilidad = DURABILIDAD_LOPEZ_REGGAE;
		this.tipoEnemigo = LOPEZ_REGGAE;
		
	}//fin de convertirALopezReggae
	
	public void convertirALopezReggaeAlado(){
		
		this.cargarEstrategiaMovimientosPosiblesAlados();
		this.estrategiaMovimientoActual= this.estrategiaMovimientosPosibles[0];
		this.indiceEstrategiaMovimientoPosibleActual= 0;
		this.durabilidad = DURABILIDAD_LOPEZ_REGGAE_ALADO;
		this.tipoEnemigo= LOPEZ_REGGAE_ALADO;
		
	}//fin de convertirALopezReggaeAlado
		
	
	public boolean mover(){
		
		return this.estrategiaMovimientoActual.mover(this, this.obtenerPosicion());
		
	}//fin de mover
	
	public void cambiarEstrategiaMovimiento(EstrategiaMovimiento em){
		if(em == null)
			return;
		this.estrategiaMovimientoActual = em;
	}//fin de cambiarEstrategiaMovimiento
	
	
	private void cargarEstrategiaMovimientosPosiblesDefault(){
		
		this.estrategiaMovimientosPosibles= new EstrategiaMovimiento[4];
		this.estrategiaMovimientosPosibles[0]= new EmpujadorArriba();
		this.estrategiaMovimientosPosibles[1]= new EmpujadorIzquierda();
		this.estrategiaMovimientosPosibles[2]= new EmpujadorAbajo();
		this.estrategiaMovimientosPosibles[3]= new EmpujadorDerecha();
		
	}
	
	private void cargarEstrategiaMovimientosPosiblesAlados(){
		
		this.estrategiaMovimientosPosibles= new EstrategiaMovimiento[4];
		this.estrategiaMovimientosPosibles[0]= new MovimientoAladoArriba();
		this.estrategiaMovimientosPosibles[1]= new MovimientoAladoIzquierda();
		this.estrategiaMovimientosPosibles[2]= new MovimientoAladoAbajo();
		this.estrategiaMovimientosPosibles[3]= new MovimientoAladoDerecha();
		
	}
	
	public void cambiarEstrategiaMovimientosPosibles(EstrategiaMovimiento[] em){
		if(em.length == 0)
			return;
		this.estrategiaMovimientosPosibles = em;
	}
		
	public void moverseConOtraEstrategia(){
		indiceEstrategiaMovimientoPosibleActual++;
		if(indiceEstrategiaMovimientoPosibleActual >= (this.estrategiaMovimientosPosibles.length ))
			this.indiceEstrategiaMovimientoPosibleActual= 0;
		this.cambiarEstrategiaMovimiento( this.estrategiaMovimientosPosibles[indiceEstrategiaMovimientoPosibleActual] );
	}
		
	@Override
	public void actualizarEstado(double tiempoCiclo) {
		
		boolean seguirEnMismaDireccion = true;
		
		this.cronometroAtaque += tiempoCiclo;
		this.cronometroMovimiento += tiempoCiclo;
		if(this.cronometroMovimiento >= this.delayMovimiento){
			seguirEnMismaDireccion = this.mover();
			cronometroMovimiento = 0.0;
		}
		
		if(!seguirEnMismaDireccion)
			this.moverseConOtraEstrategia();
		
		if(this.cronometroAtaque >= this.delayAtaque){
			this.atacar();
		}

		
	}//fin de actualizarEstado
	
	public Bomba atacar(){
		Bomba bombaColocar =  this.bombaDelEnemigo.clone();//no retorna null
		if(this.obtenerPosicion()== null){
			System.out.println("posicionEnemigoEsNull");
			return null;
		}
		if(this.obtenerPosicion().hayUnOcupanteSuperpuesto())
			return null;
		this.obtenerPosicion().compartir(bombaColocar);
		return bombaColocar;
	}//fin de atacar

	@Override
	public boolean esAtravesable() {
		return true;
	}
	
	public double obtenerCronometroAtaque(){
		return this.cronometroAtaque;
	}//fin de obtenerCronometroAtaque
	
	public void resetearCronometroAtaque(){
		this.cronometroAtaque= 0.0;
	}//fin de resetearCronometroAtaque

	
	@Override
	public void lastimar(int poder){
		if(poder<=PODER_ENEMIGO)
			return;
		super.lastimar(poder);
		
	}//fin de lastimar
	
	public int obtenerTipoEnemigo(){
		return this.tipoEnemigo;
	}//fin de obtenerTipoEnemigo
	
}//fin de Enemigo
